package net.servir.capacidades.web.controller;

import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.ExmCalifica;
import net.servir.capacidades.model.ExmConfig;
import net.servir.capacidades.model.ExmPerfil;
import net.servir.capacidades.model.GrupoExmCalifica;
import net.servir.capacidades.model.GrupoExmConfig;
import net.servir.capacidades.model.NivelGobierno;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.jsp.JspPerfilExamenImpresion;
import net.servir.capacidades.service.AlgoritmoService;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.MantenimientoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class PerfilExamenImpresionController {

	@Autowired 
	private CapacidadesService capacidadesService;
	@Autowired 
	private MantenimientoService mantenimientoService;
	
	@Autowired 
	private AlgoritmoService algoritmoService;
	
	
	@RequestMapping("/perfilExamenImpresion.htm")
	public @ModelAttribute("perfil")
	JspPerfilExamenImpresion imprimir(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		JspPerfilExamenImpresion obj = new JspPerfilExamenImpresion();

		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		
		HttpSession session = request.getSession();
		String cod_session =session.getId();

		String dniResponsable = null;
		if(session.getAttribute("dni") != null)			
			dniResponsable = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del Usuario
		Usuario usuario = null;
		if(session.getAttribute("usuario") != null)			
			usuario = (Usuario)session.getAttribute("usuario");
		
		
		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");
		
		obj.setUsuario(usuario);				
		//************************************************************
		
		ExmPerfil exmPerfil = new ExmPerfil();
		Number idExmPerfil = null;
		/* agregar los métodos para las listas*/
		LinkedList<GrupoExmConfig> gruposConfig = null;		
		LinkedList<GrupoExmCalifica> gruposCalifica = null;
		
		if (request.getParameter("id_exm_perfil") != null && !request.getParameter("id_exm_perfil").equals(""))
		{
			idExmPerfil = Integer.parseInt(request.getParameter("id_exm_perfil").trim());
			
			exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);
			
			List<NivelGobierno> lstNivelGobierno = capacidadesService.ObtenerNivelGobiernos();
			List<PuestoTipo> lstPuestoTipo = mantenimientoService.getPuestoTipos(exmPerfil.getId_sistema());
			
			gruposConfig = new LinkedList<GrupoExmConfig>();
			for (PuestoTipo puestoTipo : lstPuestoTipo) {
				for (NivelGobierno nivelGobierno : lstNivelGobierno) {				
					GrupoExmConfig grp = new GrupoExmConfig();
					grp.setNivel_gobierno(nivelGobierno.getDescripcion());
					grp.setPuesto(puestoTipo.getPuesto_tipo());
					
					List<ExmConfig> listConfig = algoritmoService.getConfigPreguntasPerfil(idExmPerfil, nivelGobierno.getId_nivel_gobierno() , puestoTipo.getId_puesto_tipo());
					grp.setListConfig((LinkedList)listConfig);
					
					gruposConfig.add(grp);
				}
			}			

			gruposCalifica = new LinkedList<GrupoExmCalifica>(); 
			for (PuestoTipo puestoTipo : lstPuestoTipo) {
				GrupoExmCalifica grp = new GrupoExmCalifica();
				grp.setPuesto(puestoTipo.getPuesto_tipo());
				
				List<ExmCalifica> listCalifica = algoritmoService.getConfigCalificaPerfil(idExmPerfil, puestoTipo.getId_puesto_tipo());
				grp.setListCalifica((LinkedList<ExmCalifica>)listCalifica);
				
				gruposCalifica.add(grp);
			}
			
		}		
		obj.setExmPerfil(exmPerfil);
		obj.setGruposConfig(gruposConfig);
		obj.setGruposCalifica(gruposCalifica);
		
		return obj;
	}

}
